﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <set>
#include <map>

using namespace std;

//void Test()
//{
//	int a[] = { 1,3,5,7,9,2,4,6,8,0,1,3,5,7,9,2,4,6,8,0 };
//	set<int> s(a, a + sizeof(a) / sizeof(a));
//	cout << s.size() << endl;
//
//	// 正向打印set中的元素
//	for (auto& e : s)
//	{
//		cout << e << " "; // 从打印结果可以看出set可以去重
//	}
//	cout << endl;
//
//	// 使用迭代器逆向打印set中的元素
//	for (auto it = s.rbegin(); it != s.rend(); it++)
//	{
//		cout << *it << " ";
//	}
//	cout << endl;
//
//	// set中值为2的元素出现了几次
//	cout << s.count(2) << endl;
//}

//void Test_set()
//{
//	set<int> s;
//	s.insert(5);
//	s.insert(2);
//	s.insert(4);
//	s.insert(6);
//	s.insert(1);
//	s.insert(3);
//	s.insert(2);
//	s.insert(8);
//	s.insert(4);
//	// 正向打印set中的元素，从打印结果可以看出set可以去重
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	auto ret1 = s.insert(2);
//	cout << ret1.second << endl;
//
//	pair<set<int>::iterator, bool> ret2 = s.insert(2);
//	cout << ret2.second << endl;
//
//	if (s.count(6))
//	{
//		cout << "6在" << endl;
//	}
//	else
//	{
//		cout << "6不在" << endl;
//	}
//
//	if (s.count(10))
//	{
//		cout << "10在" << endl;
//	}
//	else
//	{
//		cout << "10不在" << endl;
//	}
//
//	s.erase(3); // 删除存在的
//	s.erase(10); // 删除不存在的
//	for (auto e : s)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//}
//
//int main()
//{
//	Test_set();
//
//	return 0;
//}
//
////////////////////////////////////////////////////////////////////////////////////////////////////


void Test_map()
{
	map<string, string> m;

	// 向map中插入元素的方式：
	// 1.将键值对<"peach","桃子">插入map中，用pair直接构造键值对
	m.insert(pair<string, string>("peach", "桃子"));
	// 2.将键值对<"banana","香蕉">插入map中，用make_pair函数来构造键值对
	m.insert(make_pair("banana", "香蕉"));
	// 3.用operator[]向map中插入元素
	m["apple"] = "苹果";
	/*operator[]的原理是：
  	用<key, T()>构造一个键值对，然后调用insert()函数将该键值对插入到map中
  	如果key已经存在，插入失败，insert函数返回该key所在位置的迭代器
	如果key不存在，插入成功，insert函数返回新插入元素所在位置的迭代器
  	operator[]函数最后将insert返回值键值对中的value返回*/

	//m.at("waterme") = "水蜜桃"; // key不存在时抛异常
	cout << m.size() << endl;

	// 用迭代器去遍历map中的元素，可以得到一个按照key排序的序列
	for (auto& e : m)
	{
		cout << e.first << "---->" << e.second << endl;
	}
	cout << endl;

	// map中的键值对key一定是唯一的，如果key存在将插入失败
	auto ret = m.insert(make_pair("peach", "桃子"));
	if (ret.second)
	{
		cout << "<peach, 桃子>不在map中, 已经插入" << endl;
	}
	else
	{
		cout << "键值为peach的元素已经存在：" << ret.first->first << "--->"
			<< ret.first->second << " 插入失败" << endl;
	}

	// 删除key为"apple"的元素
	m.erase("apple");
	if (1 == m.count("apple"))
	{
		cout << "apple还在" << endl;
	}
	else
	{
		cout << "apple被吃了" << endl;
	}
}

int main()
{
	Test_map();

	return 0;
}